草庐IT

C++ 对和指针

全部标签

c++ - 递增指向派生类的指针

我正在为指向派生类的指针编写一个程序。这是我的代码,#includeusingnamespacestd;classbase{inti;public:voidset_i(intnum){i=num;}intget_i(){returni;}};classderived:publicbase{intj;public:voidset_j(intnum){j=num;}intget_j(){returnj;}};intmain(){base*bp;derivedd[2];bp=d;d[0].set_i(1);d[1].set_i(2);coutget_i()get_i();return0;}程

c++ - 如何从对象指针 vector 创建对象值 vector ?

“天真的”解决方案是;std::vectorvector_of_objects;vector_of_objects.reserve(vector_of_pointers.size());for(Tconst*p:vector_of_pointers)vector_of_objects.push_back(*p);上面的内容看起来很麻烦,而且可能不是很明显。是否有一种解决方案至少不会显着降低效率并且可能更快更直观?我在想C++11可能有一个我不知道的解决方案…… 最佳答案 将所有内容写在一行中是否意味着更短的代码?没有。在我看来,这两

c++ - 正在打印空指针未定义行为吗?

研究thisquestion的示例代码时我原以为是未定义的行为阻止了std::cout的后续使用打印。但事实证明attemptingtoprintanullpointercausedstd::ios_base::badbitandstd::ios_base::failbittobesetinitsstreamstate这是它无法运行的真正原因。因此,我现在很好奇它是否真的未定义行为(尝试)打印空指针。所以这是我的问题:打印空指针是未定义行为吗?如果是这样,导致这种情况的流插入器是什么?我很确定插入器足够聪明,不会取消引用空指针。我还想知道插入器为何在此上下文中遇到空指针时设置其错误掩码

c++ - 为什么通过引用捕获变量的 lambda 不能转换为函数指针?

如果我有一个通过引用捕获所有自动变量的lambda([&]{}),为什么它不能转换为函数指针?常规函数可以修改变量,就像通过引用捕获所有内容的lambda一样,那么为什么不一样呢?换句话说,我想,具有&捕获列表的lambda与常规函数之间的功能区别是什么,以至于lambda不能转换为函数指针? 最佳答案 让我们以一个简单的lambda为例:Objecto;autofoo=[&]{returno;};foo的类型是什么样的?它可能看起来像这样:struct__unique_unspecified_blah{operator()()co

c++ - 比较 std::vector 的指针来检查相等性是否安全?

一次,我创建了一个指向std::vector的指针,然后我做了一些push_back、reserve、resize对该vector的操作,在这样的操作之后,将指针与该vector的地址进行比较以检查指针是否指向该vector是否安全,因为可能会重新分配内存。例如std::vectorvec;vector*pVec=&vec;vec.reserve(10000);assert(pVec==&vec);vec=anotherVec;assert(pVec==&vec);此外,将指针与vector的第一个值进行比较是否安全?例如:std::vectorvec(1,0);int*p=&vec[

c++ - typedef 智能指针是不好的做法吗?

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭7年前。Improvethisquestion我在当前的项目中使用智能指针,使用它们时必须键入长行代码似乎非常麻烦。因为我希望我的代码更简洁、更容易理解,所以我开始像这样对智能指针进行类型定义:typedefstd::unique_ptrSystemPtr;所以我的问题是,typedef智能指针是不好的做法吗?

c++ - 如何将 unique_ptr 移动到原始指针?

我有一个函数,用于分配给定大小的缓冲区。缓冲区将在返回前预处理/填充一些数据。此预处理可能会返回false以表示此缓冲区未正确处理。所以我想在这个缓冲区上应用RAII以避免在没有delete[]的情况下提前返回通常我使用unique_ptr帮助我自动释放本地分配的对象。在这种情况下,我需要返回这个分配的对象(由unique_ptr拥有)并将所有权转移给调用者。但是编译器提示我无法转换unique_ptr至T*而我std::moveunique_ptr.看起来像unique_ptr只能移动到另一个unique_ptr而不是原始指针。有什么方法可以从unique_ptr转移所有权吗?到ra

c++ - 智能指针析构函数调用的 vector

为什么在下面的代码中节点析构函数只被调用一次而不是5次?#include#include#includestructNode{~Node(){std::cout>nodes(5,std::make_shared());}intmain(){foo();std::cout 最佳答案 您的vector包含原始共享指针的五个拷贝,所有拷贝都共享一个指针对象的所有权。要创建五个独立的对象,每个对象由一个共享指针拥有,可以这样写:std::vector>nodes;for(inti=0;i!=5;++i)nodes.push_back(std

c++ - std::string 类成员应该是指针吗?

为什么/为什么不呢?假设我有一个类,它在构造函数中接收一个字符串并将其存储。这个类成员应该是一个指针,还是只是一个值?classX{X(conststd::string&s):s(s){}conststd::strings;};或者...classX{X(conststd::string*s):s(s){}conststd::string*s;};如果我要存储原始类型,我会复制一份。如果要存储对象,我会使用指针。我觉得我想要复制那个字符串,但我不知道什么时候决定。我应该复制vector吗?套?map?整个JSON文件...?编辑:听起来我需要阅读移动语义。但无论如何,我想让我的问题更具

c++ - 获取指向智能指针指向的对象的指针 - Ivalue 错误

我目前正在尝试调用一个sqlite3库函数,它希望我向它传递一个sqlite3**。这是我当前的代码。我有一个工作部分和一个给我错误的部分:sqlite3*sqlite=m_db.get();if(sqlite3_open(std::string(m_dbName.begin(),m_dbName.end()).c_str(),&sqlite)){}if(sqlite3_open(std::string(m_dbName.begin(),m_dbName.end()).c_str(),&(m_db.get()))){}我的m_db字段如下所示:std::unique_ptrm_db=n